/* ========================================================================= */
/* ------------------------------------------------------------------------- */
/*!
  \file			pglayglob.cc
  \date			Sep 2012
  \author		TNick

  \brief		Contains the implementation of PgLayGlob class


*//*


 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Please read COPYING and README files in root folder
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
//
//
//
//
/*  INCLUDES    ------------------------------------------------------------ */

#include	<cpg/cpg.h>

#include	<cpg/logic/cpgdoc.h>
#include	<cpg/logic/pgspace.h>
#include	<cpg/logic/pgitem.h>

#include	"pglayglob.h"


/*  INCLUDES    ============================================================ */
//
//
//
//
/*  DEFINITIONS    --------------------------------------------------------- */

using namespace cpg;

/*  DEFINITIONS    ========================================================= */
//
//
//
//
/*  DATA    ---------------------------------------------------------------- */

/*  DATA    ================================================================ */
//
//
//
//
/*  CLASS    --------------------------------------------------------------- */

/* ------------------------------------------------------------------------- */
PgLayGlob::PgLayGlob			( CpgDoc * doc, PgLayer * layer )
	: PgLayer()
{
	doc_ = doc;
	idx_ = -1;
	LyData		ld;
	layer->getData( ld );
	setData( ld );
	if ( doc != layer->document() )
	{
		/** @todo we have to worry about the characteristics like color and pattern */


	}

	/* insert the placeholder in each space */
	int i_max = doc_->spaceCount();
	for ( int i = 0; i < i_max; i++ )
	{
		doc_->space( i )->addLayer(  (PgItTree*)NULL );
	}

}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
PgLayGlob::~PgLayGlob()
{
	/* stub */
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
PgItTree *			PgLayGlob::items				( PgSpace * spc )
{
	return spc->items( this );
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool				PgLayGlob::extents				(
		PgSpace * spc, ABOX2D & r )
{
	PgItTree *	items = spc->items( this );
	r.reset();
	if ( items != NULL )
	{
		return items->boundingBox( r );
	}
	return false;
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool				PgLayGlob::addItem				(
		PgSpace * spc, PgItem  *itm)
{
	Q_ASSERT( spc != NULL );
	Q_ASSERT( itm != NULL );
	PgItTree *	items = spc->items( this );
	if ( items != NULL )
	{
		ABOX2D		bbox;
		itm->boundingBox( bbox );
		return items->insert( itm, bbox );
	}
	return false;
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool				PgLayGlob::remItem				(
		PgSpace * spc, PgItem * itm )
{
	Q_ASSERT( spc != NULL );
	Q_ASSERT( itm != NULL );
	PgItTree *	items = spc->items( this );
	if ( items != NULL )
	{
		return items->removeOne( itm );
	}
	return false;
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
void				PgLayGlob::forceExtractFromDoc	(
		QList<PgItTree *> & items )
{
	int i_max;
	int i;
	i_max = doc_->spaceCount();
	items.clear();
	for ( i = 0; i < i_max; i++ )
	{
		items.append( doc_->space( i )->remGlobalLayer( idx_ ) );
	}
	doc_->remLayer( idx_ );

}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
void				PgLayGlob::forceInsertInDoc		(
		const QList<PgItTree *> & items )
{
	int i_max;
	int i;

	i_max = doc_->spaceCount();
	if ( items.count() == 0 )
	{
		for ( i = 0; i < i_max; i++ )
		{
			doc_->space( i )->addLayer( (PgItTree*)NULL );
		}
	}
	else
	{
		Q_ASSERT( items.count() == i_max );
		for ( i = 0; i < i_max; i++ )
		{
			doc_->space( i )->addLayer( items.at( i ) );
		}
	}
	i = doc_->addLayer( this );
	setGlobalIndex( i );
}
/* ========================================================================= */


/*  CLASS    =============================================================== */
//
//
//
//
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
